/*-------------------------------------------------------------------------
 *
 * value.h
 *	  值节点的接口
 *
 *
 * Copyright (c) 2003-2022, PostgreSQL Global Development Group
 *
 * src/include/nodes/value.h
 *
 *-------------------------------------------------------------------------
 */

#ifndef VALUE_H
#define VALUE_H

#include "nodes/nodes.h"

/*
 * 节点类型 Integer、Float、String 和 BitString 用于在词法分析器中表示文字，并在解析器中传递常量。 这些节点类型与普通的 int 或 char * 之间的一个区别在于，节点可以放入 List 中。
 *
 * （以前有一个 Value 节点，包括所有这些不同的节点类型。因此这个文件的名称。）
 */

typedef struct Integer
{
	NodeTag		type;
	int			ival;
} Integer;

/*
 * Float 在内部表示为字符串。 使用 T_Float 作为节点类型仅表示字符串的内容看起来像有效的数字文字。 该值可能最终转换为 NUMERIC，因此我们不能将其在内部存储为 C double，因为这样可能会损失精度。 由于这些节点通常只在解析过程中使用，而不是用于运行时数据，因此使用更通用的表示方式更好。
 *
 * 请注意，像整数的字符串如果值过大无法适应 'int'，将被词法分析为 T_Float。
 */
typedef struct Float
{
	NodeTag		type;
	char	   *fval;
} Float;

typedef struct Boolean
{
	NodeTag		type;
	bool		boolval;
} Boolean;

typedef struct String
{
	NodeTag		type;
	char	   *sval;
} String;

typedef struct BitString
{
	NodeTag		type;
	char	   *bsval;
} BitString;

#define intVal(v)		(castNode(Integer, v)->ival)
#define floatVal(v)		atof(castNode(Float, v)->fval)
#define boolVal(v)		(castNode(Boolean, v)->boolval)
#define strVal(v)		(castNode(String, v)->sval)

extern Integer *makeInteger(int i);
extern Float *makeFloat(char *numericStr);
extern Boolean *makeBoolean(bool var);
extern String *makeString(char *str);
extern BitString *makeBitString(char *str);

#endif							/* VALUE_H */
